home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGSCAL / TBUTIL2.LZH / INPUT.PAS < prev    next >
Pascal/Delphi Source File  |  1983-03-08  |  7KB  |  331 lines

  1. {$debug-}
  2.  
  3. program in_put(input,output,outfile);
  4.  
  5. var
  6.   outfile : text;
  7.   number  : string (6);
  8.   inline  : lstring (255);
  9.   hold    : lstring (255);
  10.   done    : boolean;
  11.   count   : word;
  12.   inkey   : char;
  13.   special : boolean;
  14.   on_entry: boolean;
  15.   reshow  : boolean;
  16.  
  17. value
  18.   done     := false;
  19.   on_entry := true;
  20.   count    := 0;
  21.   number   := '000001';
  22.   inline   := null;
  23.   hold     := null;
  24.  
  25. const
  26.   f1   = chr (59);
  27.   f2   = chr (60);
  28.   f10  = chr (68);
  29.   bs   = chr (08);
  30.   left = chr (75);
  31.   rc   = chr (13);
  32.     
  33. procedure csrloc (x: word);
  34.   external;
  35.  
  36. procedure chrget (var x: word);
  37.   external;
  38.     
  39. procedure next_key;
  40.   var [static]
  41.     x  : word;
  42.     lo : byte;
  43.     hi : byte;
  44.   begin
  45.     chrget (x);
  46.     lo := lobyte (x);
  47.     hi := hibyte (x);
  48.     if lo = 0 then
  49.       begin
  50.         special := true;
  51.         inkey   := chr (hi);
  52.       end
  53.     else
  54.       begin
  55.         special := false;
  56.         inkey   := chr (lo);
  57.       end;
  58.   end;
  59.       
  60. procedure clear_line;
  61.   var [static]
  62.     blanks79 : string (79);
  63.     first    : boolean;
  64.     i        : word;
  65.   value
  66.     first    := true;
  67.   begin
  68.     if first then
  69.       begin
  70.         first := false;
  71.         for i := 1 to 79 do
  72.           blanks79 [i] := ' ';
  73.       end;
  74.     csrloc (6144);
  75.     write (blanks79);
  76.     csrloc (6144);
  77.   end;
  78.     
  79. procedure show_so_far_after_clear;
  80.   begin
  81.     if on_entry then
  82.       write (number,'=',inline)
  83.     else
  84.       write ('Enter new page number : ',inline);
  85.   end;
  86.  
  87. procedure show_so_far;
  88.   begin
  89.     clear_line;
  90.     show_so_far_after_clear;
  91.   end;
  92.  
  93. procedure strip_blanks;
  94.   var [static]
  95.     i      : word;
  96.   begin
  97.     if (inline.len > 0) and (inline[1] = ' ') then
  98.       reshow := true
  99.     else
  100.       reshow := false;
  101.     { strip leading blanks }
  102.     while (inline.len > 0) and then (inline [1] = ' ') do
  103.       begin
  104.         for i := 2 to inline.len do
  105.           inline [i-1] := inline [i];
  106.         inline.len := inline.len - 1;
  107.       end;
  108.     { strip trailing blanks }
  109.     while (inline.len > 0) and then (inline [inline.len] =  ' ') do
  110.       inline.len := inline.len - 1;
  111.   end;
  112.   
  113. procedure digest_number;
  114.   var [static]
  115.     all_numeric  : boolean;
  116.     i            : word;
  117.     j            : word;
  118.   begin
  119.     strip_blanks;
  120.     if inline = null then
  121.       begin
  122.         number := '000001';
  123.         return;
  124.       end;
  125.     all_numeric := true;
  126.     for i := 1 to inline.len do
  127.       if not (inline [i] in ['0'..'9']) then
  128.         begin
  129.           all_numeric := false;
  130.           break;
  131.         end;
  132.     if all_numeric then
  133.       begin
  134.         number := '000000';
  135.         for i := 6 downto 1 do
  136.           begin
  137.             if inline.len < (7-i) then
  138.               break
  139.             else
  140.               number [i] := inline [inline.len + i - 6];
  141.           end;
  142.       end
  143.     else
  144.       begin
  145.         number := '      ';
  146.         if inline.len < 6 then
  147.           j := inline.len
  148.         else
  149.           j := 6;
  150.         for i := 1 to j do
  151.           number [i] := inline [i];
  152.       end;
  153.   end;
  154.   
  155. procedure increment;
  156.   var [static]
  157.     i     : word;
  158.     j     : word;
  159.     carry : boolean;
  160.   begin
  161.     i := 7;
  162.     for j := 6 downto 2 do
  163.       if number [j] = ' ' then
  164.         i := j
  165.       else
  166.         break;
  167.     repeat
  168.       carry := false;
  169.       i := i - 1;
  170.       if i = 0 then
  171.         return;
  172.       if number [i] in ['0'..'9'] then
  173.         if number [i] = '9' then
  174.           begin
  175.             number [i] := '0';
  176.             carry := true;
  177.           end
  178.         else
  179.           number [i] := chr (1 + ord (number [i]))
  180.       else
  181.         begin
  182.           for j := 6 downto (i+2) do
  183.             number [j] := number [j-1];
  184.           if i < 6 then
  185.           number [i+1] := '1';
  186.         end;
  187.     until not carry;
  188.   end;
  189.  
  190. procedure initialize;
  191.   var [static]
  192.     i : word;
  193.   begin
  194.     rewrite (outfile);
  195.     for i := 1 to 25 do
  196.       writeln;
  197.     writeln ('Index data entry program (C) Copyright Peter Norton 1983');
  198.     writeln;
  199.     writeln ('Function keys :  f1 - enter new page number');
  200.     writeln ('                 f2 - increment page number');
  201.     writeln ('                f10 - end operation');
  202.     writeln;
  203.     writeln (' Page = Index entry description');
  204.     writeln ('______ _____________________________________________________');
  205.     show_so_far;
  206.   end;
  207.         
  208. procedure process_rc;
  209.   begin
  210.     if on_entry then
  211.       begin
  212.         strip_blanks;
  213.         if inline.len = 0 then
  214.           return;
  215.         count := count + 1;
  216.         if reshow then
  217.           show_so_far;
  218.         writeln (outfile,number,'=',inline);
  219.         writeln;
  220.         if special and (inkey = f10) then
  221.           return;
  222.         inline := null;
  223.         show_so_far_after_clear;
  224.       end
  225.     else
  226.       begin
  227.         on_entry := true;
  228.         digest_number;
  229.         inline := hold;
  230.         show_so_far;
  231.       end;
  232.   end;
  233.  
  234. procedure process_f10;
  235.   begin
  236.     if on_entry and (inline.len > 0) then
  237.       process_rc;
  238.     done := true;
  239.   end;
  240.  
  241. procedure process_regular;
  242.   begin
  243.     if inline.len > 71 then
  244.       begin
  245.         write (chr(7));
  246.         return;
  247.       end;
  248.     inline.len := inline.len + 1;
  249.     inline [inline.len] := inkey;
  250.     write (inkey);
  251.   end;
  252.  
  253. procedure process_invalid_special;
  254.   begin
  255.     clear_line;
  256.     writeln;
  257.     writeln ('Special key ignored.');
  258.     writeln;
  259.     write (chr(7));
  260.     show_so_far;
  261.   end;
  262.  
  263. procedure process_f1;
  264.   begin
  265.     if not on_entry then
  266.       begin
  267.         process_invalid_special;
  268.         return;
  269.       end;
  270.     on_entry := false;
  271.     hold := inline;
  272.     inline := null;
  273.     show_so_far;
  274.   end;
  275.  
  276. procedure process_f2;
  277.   begin
  278.     if not on_entry then
  279.       begin
  280.         process_invalid_special;
  281.         return;
  282.       end;
  283.     increment;
  284.     show_so_far;
  285.   end;
  286.  
  287. procedure process_bs;
  288.   begin
  289.     if inline.len > 0 then
  290.       begin
  291.         inline.len := inline.len - 1;
  292.         write (bs,' ',bs);
  293.       end
  294.     else
  295.       show_so_far;
  296.   end;
  297.  
  298. procedure process_input;
  299.   begin
  300.     next_key;
  301.     if special then
  302.       case inkey of
  303.          f1:      process_f1;
  304.          f2:      process_f2;
  305.         f10:      process_f10;
  306.         left:     process_bs; 
  307.         otherwise process_invalid_special;
  308.       end
  309.     else
  310.       case inkey of
  311.         rc:       process_rc;
  312.         bs:       process_bs;
  313.         otherwise process_regular;
  314.       end;
  315.   end;
  316.   
  317. procedure finish_up;
  318.   begin
  319.     close (outfile);
  320.     writeln;
  321.     writeln (count,' index entries written.');
  322.   end;
  323.  
  324. begin
  325.   initialize;
  326.   repeat
  327.     process_input
  328.   until done;
  329.   finish_up;
  330. end.
  331.